Feldleisten verwenden und SELECT INTO TABLE
Der Datentransport zwischen der Datenbank und dem ABAP-Programm ist eine kritische Größe. Deswegen sollte die zu transportierende Datenmenge möglichst klein sein und möglichst selten stattfinden.
Versuchen Sie deswegen möglichst eine Struktur zu verwenden, die nur die von Ihnen benötigten Daten aus der oder den Tabellen enthält.
Es ist zum Beispiel ein großer Unterschied, ob sie alle Felder der VBAP einlesen (Strukturbreite > 1300 Bytes!!) oder nur die benötigten.
Verwenden Sie zur Selektion den Befehl SELECT INTO TABLE. Hierdurch wird die Ergebnismenge mit einem Schlag in die interne Tabelle transportiert. Das spart Zeit!
Probieren Sie es am besten selbst einmal aus…
Das folgende Beispiel zeigt zum Beispiel die folgenden Werte an:
Laufzeit mehrere Selects: 47.690.833
Laufzeit Inner Join: 1.771.508
Der Speicherverbrauch lag bei diesem Beispiel nur für die Tabelle T_VBAP bei 35.600.000 Bytes. Die kleiner Tabelle T_ITAB dagegen kommt mit 820.000 Bytes aus! Die anderen Tabellen verbrauchen natürlich auch noch Speicherplatz (T_VBAK: 6.100.000 Bytes, T_VBUP: 1.500.000 Bytes).
Die Funktion SELECT INTO TABLE hat noch einen weiteren nicht zu unterschätzenden Vorteil: Sie können die Programmlogik im Debugging ungestört nachvollziehen. In einer SELECT-ENDSELECT-Schleife bricht der Debugger ab dem zweiten Satz mit dem Kurzdump “Unzulässige Unterbrechung einer Datenbankselektion” ab!
Beispielprogramm
REPORT zzdemo_laufzeit1.
DATA:
*– Variablen für die Zeitmessung
start TYPE i,
stopp TYPE i,
diff TYPE i,
*– Interne Tabellen für Select
t_vbak LIKE vbak OCCURS 0 WITH HEADER LINE,
t_vbap LIKE vbap OCCURS 0 WITH HEADER LINE,
t_vbup LIKE vbup OCCURS 0 WITH HEADER LINE,
*– Interne Tabelle für Inner Join
BEGIN OF t_itab OCCURS 0,
vbeln TYPE vbeln,
posnr TYPE posnr,
auart TYPE auart,
ntgew TYPE ntgew,
gewei TYPE gewei,
lfsta TYPE lfsta,
END OF t_itab.
*– Auswahl: Vertriebsbelegnummer
SELECT-OPTIONS: s_vbeln FOR t_itab-vbeln.
START-OF-SELECTION.
GET RUN TIME FIELD start.
*– Select über Auftragskopf VBAK
SELECT * FROM vbak INTO t_vbak WHERE vbeln IN s_vbeln.
*– Select über Auftragsposition VBAP
SELECT * FROM vbap INTO t_vbap WHERE vbeln = t_vbak-vbeln.
*– Select über den Positionsstatus
SELECT SINGLE * FROM vbup INTO t_vbup
WHERE vbeln = t_vbap-vbeln
AND posnr = t_vbap-posnr.
APPEND t_vbup.
APPEND t_vbap.
ENDSELECT.
APPEND t_vbak.
ENDSELECT.
*– Zeit stoppen
GET RUN TIME FIELD stopp.
diff = stopp – start.
WRITE: / ‘Laufzeit mehrere Selects:’, diff.
*– Erneute Messung für Inner Join
GET RUN TIME FIELD start.
*– Inner Join mit Feldleiste
SELECT vbak~vbeln
vbap~posnr
vbak~auart
vbap~ntgew
vbap~gewei
vbup~lfsta
FROM vbak INNER JOIN vbap ON vbak~vbeln = vbap~vbeln
INNER JOIN vbup ON vbup~vbeln = vbap~vbeln
AND vbup~posnr = vbap~posnr
INTO TABLE t_itab
WHERE vbak~vbeln IN s_vbeln.
*– Zeit stoppen
GET RUN TIME FIELD stopp.
diff = stopp – start.
WRITE: / ‘Laufzeit Inner Join:’, diff.
- Meine Eclipse-Plugins - 22. November 2024
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024